home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SUOMISRC.ARJ / 612.ASM next >
Assembly Source File  |  1994-12-07  |  10KB  |  318 lines

  1. ;SUOMI-INTRO Copyright Napalm Software 1994
  2. ;------------------------------------------
  3. ;
  4. ;Tämä pieni "intro" luotiin täysin hetken mielijohteessa Suomen itsenäisen
  5. ;tasavallan 77. itsenäisyyspäivänä 6.12.1994. "Intron" koko, 612 tavua, ei ole
  6. ;sattuma, vaan alusta lähtien tuo koko oli tavoitteena: 612 eli 6.12, itse-
  7. ;näisyyspäivän päivämäärä! Tätä introa pystyisi vielä pienentämään varmaan
  8. ;melko paljonkin, mutta kun koko 612 tavua oli tavoitteena, niin miksi mennä
  9. ;muuttamaan sitä?
  10. ;
  11. ;Koodin kirjoittivat Tapio Äijälä (Unsigned) ja Antti Virtanen (Lökö) ja
  12. ;aikaa siihen kului useita tunteja johtuen äänien ohjelmoinnissa kohdatuista
  13. ;pienistä ongelmista, joita sitten ratkottiin noin 3-4 tuntia... :)
  14. ;
  15. ;Laitteistolta tämä "intro" vaatii 286 prosessorin, AdLib:iä hyödynnetään
  16. ;jos sellainen tai yhteensopiva laitteistosta löytyy, mutta sen olemassa oloa
  17. ;ei tarkisteta mitenkään! Toivokaamme siis, että kenenkään kone ei kaadu
  18. ;tämän takia...
  19. ;
  20. ;Jokaista pientä asiaa ei ole erikseen kommentoitu, vaan esim. jokaisen
  21. ;aliohjelman kommentista pitäisi selvitä mitä kyseinen aliohjelma tekee.
  22. ;Toivottavasti... Jos et ymmärrä miksi jokin tehdään niin kuin tehdään, niin
  23. ;ota reippaasti yhteyttä meihin (tai keneenkä vaan kuka asian ymmärtää!) ja
  24. ;kysy! Napalm Softwaren yhteystiedot löytyvät readme.txt:stä.
  25.  
  26. .286
  27. code    segment
  28.         assume cs:code, ds:code, es:code
  29.         org 100h
  30.  
  31. ;Tästä alkaa pääohjelma
  32. main:
  33.   mov ax,3              ;Asetetaan näyttötilaksi 80x25 tekstitila
  34.   int 10h
  35.  
  36.   mov dx,3d4h           ;Kätketään kursori
  37.   mov ax,800eh
  38.   out dx,ax
  39.  
  40.   push cs
  41.   pop  es
  42.  
  43.   call reset_adlib      ;Kutsutaan aliohjelmaa, joka resetoi AdLib:in
  44.  
  45.   mov bx,0120h          ;Luodaan jonkinlainen "instrumentti"
  46.   call write_reg
  47.   mov bx,1040h
  48.   call write_Reg
  49.   mov bx,4c60h
  50.   call write_Reg
  51.   mov bx,0123h
  52.   call write_rEg
  53.   mov bx,0f43h
  54.   call write_Reg
  55.   mov bx,6363h
  56.   call write_reg
  57.  
  58.   mov bp,offset lippu  ;Muutetaan * ja + merkit lipuksi
  59.   mov dx,42
  60.   mov cx,2
  61.   mov bl,0
  62.   mov bh,16
  63.   mov ax,1110h
  64.   int 10h
  65.  
  66.   mov di,offset teksti+56 ;Asetetaan vieritettävän tekstin loppuun 80 merkkiä
  67.   mov cx,40               ;tyhjää
  68.   xor ax,ax
  69.   cld
  70.   rep stosw
  71.  
  72.   call make_flag        ;Piirretään ruudulle iso siniristilippu
  73.   call hook_timer       ;Kytketään AdLib rutiinit ajastimeen
  74.  
  75.   ;Pääsilmukka, jossa ohjelma pyörii kunnes jotain näppäintä painetaan
  76.   loopp:
  77.     mov dx,3dah         ;Odotetaan "vertical retracea"
  78.     vr1:
  79.     in al,dx
  80.     test al,8
  81.     jnz vr1
  82.     vr2:
  83.     in al,dx
  84.     test al,8
  85.     jz vr2
  86.  
  87.     call update_teksti  ;Kutsutaan aliohjelmaa, joka vierittää tekstiä
  88.  
  89.     mov ah,1
  90.     int 16h
  91.     jz loopp            ;Jos mitään näppäintä ei ole painettu, palataan alkuun
  92.  
  93.   call unhook_timer     ;Irroitetaan AdLib rutiinit ajastimesta
  94.   call reset_adlib      ;Resetoidaan AdLib
  95.  
  96.   mov ax,3              ;Asetetaan uudelleen 80x25 tekstitila
  97.   int 10h
  98.  
  99.   mov ah,9              ;Tulostetaan ruudulle lopputeksti
  100.   mov dx,offset stat_teksti
  101.   push cs
  102.   pop ds
  103.   int 21h
  104.  
  105.   ret                   ;Lopetetaan ohjelma
  106.  
  107. make_flag       proc    near             ;Aliohjelma, joka piirtää ison
  108.                 pusha                    ;Suomen lipun ruudulle
  109.                 mov ax,0b800h
  110.                 mov es,ax
  111.                 mov ax,219+15*256
  112.                 mov di,8
  113.                 mov dx,16
  114.                 @pohja:
  115.                 mov cx,72
  116.                 rep stosw
  117.                 add di,16
  118.                 dec dx
  119.                 jnz @pohja
  120.  
  121.                 mov dx,16
  122.                 mov di,8+20*2
  123.                 mov ah,1
  124.                 @pysty:
  125.                 mov cx,12
  126.                 rep stosw
  127.                 add di,160-48+24
  128.                 dec dx
  129.                 jnz @pysty
  130.  
  131.                 mov di,8+6*160
  132.                 mov dx,4
  133.                 @vaaka:
  134.                 mov cx,72
  135.                 rep stosw
  136.                 add di,16
  137.                 dec dx
  138.                 jnz @vaaka
  139.                 popa
  140.                 ret
  141. make_flag       endp
  142.  
  143. write_reg       proc near                ;Aliohjelma, jolla kirjoitetaan
  144.                 pusha                    ;haluttua dataa AdLib:in rekisterei-
  145.                 MOV    AL,BL             ;hin
  146.                 MOV    DX,388h           ;
  147.                 OUT    DX,AL             ;bl = halutun rekisterin indeksi
  148.                 MOV    CX,6              ;bh = haluttu data
  149.                 WAIT1:
  150.                 IN     AL,DX
  151.                 LOOP   WAIT1
  152.                 MOV    DX,389h
  153.                 MOV    AL,BH
  154.                 OUT    DX,AL
  155.                 MOV    CX,35
  156.                 WAIT2:
  157.                 IN     AL,DX
  158.                 LOOP   WAIT2
  159.                 popa
  160.                 ret
  161. write_reg       endp
  162.  
  163. reset_adlib     proc near                ;Resetoidaan AdLib kirjoittamalla
  164.                 pusha                    ;jokaiseen rekisteriin nollaa
  165.                 mov cx,244               ;
  166.                 xor bh,bh                ;Ei ehkä hienostunein tapa, mutta
  167.                 next:                    ;toimii 100 prosenttisesti... :)
  168.                 mov bl,cl
  169.                 call write_reg
  170.                 loop next
  171.                 popa
  172.                 ret
  173. reset_adlib     endp
  174.  
  175.  
  176. update_music    proc    near             ;Tämä aliohjelma hoitaa ajastimeen
  177.                 pusha                    ;kytkettynä musiikin soittamisen
  178.  
  179.                 xor     BH,BH            ;Nuottien aika-arvot jne. löytyvät
  180.                 xor     ah,ah            ;adlib2.inc:istä
  181.                 mov     bl,cs:[offset nuotti]
  182.                 mov     al,cs:[offset savelet+bx]
  183.                 mov     di,ax
  184.                 mov     ah,cs:[offset ajat+bx]
  185.  
  186.                 mov     bl,0a0h
  187.                 mov     bh,cs:[di+offset fnum] ;FNum ja octavenote ovat
  188.                 call    write_reg              ;valmiiksi laskettuina
  189.                 mov     bl,0b0h                ;adlib2.inc:issä
  190.                 mov     bh,cs:[di+offset octavenote]
  191.                 call    write_reg
  192.  
  193.                 inc     byte ptr cs:[offset kohta]
  194.                 cmp     byte ptr cs:[offset kohta],ah ;Note allready played?
  195.                 jne     @ei_next_note
  196.                 mov     byte ptr cs:[offset kohta],0
  197.                 inc     byte ptr cs:[offset nuotti]
  198.                 cmp     byte ptr cs:[offset nuotti],16
  199.                 jne     @ei_next_note
  200.                 mov     byte ptr cs:[offset nuotti],0
  201.                 @ei_next_note:
  202.                 popa
  203.                 jmp     dword ptr cs:[offset wanha_timer] ;Kutsutaan vanhaa
  204. update_music    endp                                      ;keskeytystä
  205.  
  206. hook_timer      proc    near             ;Tämä aliohjelma kytkee AdLib rutii-
  207.                 pusha                    ;nit ajastimeen
  208.                 mov     ax,08+35h*256
  209.                 int     21h
  210.                 mov     cs:[offset wanha_timer],bx
  211.                 mov     cs:[offset wanha_timer+2],es
  212.                 mov     ah,25h
  213.                 mov     al,8h
  214.                 mov     dx,offset update_music
  215.                 push    cs
  216.                 pop     ds
  217.                 int     21h
  218.                 popa
  219.                 ret
  220. hook_timer      endp
  221.  
  222. unhook_timer    proc    near             ;Tämä aliohjelma irroittaa AdLib
  223.                 pusha                    ;rutiinit ajastimesta
  224.                 mov     ax,cs:[offset wanha_timer + 2]
  225.                 mov     ds,ax
  226.                 mov     ah,25h
  227.                 mov     dx,cs:[offset wanha_timer]
  228.                 mov     al,8h
  229.                 int     21h
  230.                 popa
  231.                 ret
  232. unhook_timer    endp
  233.  
  234. update_teksti   proc    near             ;Tämä aliohjelma päivittää ruudulla
  235.                 pusha                    ;näkyvää tekstiä
  236.                 push    es
  237.                 push    ds
  238.                 mov     ax,0b800h
  239.                 mov     es,ax
  240.                 mov     ds,ax
  241.                 mov     di,cs:[offset txt_counter]
  242.                 mov     al,cs:[offset teksti+di]
  243.                 mov     ah,12
  244.                 mov     es:[20*160+158],ax
  245.                 mov     di,2+20*160
  246.                 mov     si,4+20*160
  247.                 mov     cx,156
  248.                 rep     movsb
  249.                 inc     word ptr cs:[offset txt_counter]
  250.                 cmp     word ptr cs:[offset txt_counter],55+80
  251.                 jle     ohi
  252.                 mov     word ptr cs:[offset txt_counter],0
  253.                 ohi:
  254.                 pop     ds
  255.                 pop     es
  256.                 popa
  257.                 ret
  258. update_teksti     endp
  259.  
  260. include         adlib2.inc               ;Tiedosto, josta löytyvät nuottien
  261.                                          ;aika-arvot jne.
  262. lippu           label byte               ;Millaiseksi * ja + merkit muutetaan
  263.                 db 00000000b
  264.                 db 00000000b
  265.                 db 00000000b
  266.  
  267.                 db 00011100b
  268.                 db 00011100b
  269.                 db 00011100b
  270.  
  271.                 db 11111111b
  272.                 db 11111111b
  273.                 db 11111111b
  274.  
  275.                 db 00011100b
  276.                 db 00011100b
  277.                 db 00011100b
  278.  
  279.                 db 00000000b
  280.                 db 00000000b
  281.                 db 00000000b
  282.                 db 00000000b
  283.                 db 00000000b
  284.                 db 00000000b
  285.                 db 00000000b
  286.  
  287.                 db 00000000b
  288.                 db 00000000b
  289.                 db 00000000b
  290.  
  291.                 db 11111111b
  292.                 db 11111111b
  293.                 db 11111111b
  294.  
  295.                 db 00000000b
  296.                 db 00000000b
  297.                 db 00000000b
  298.  
  299.                 db 00000000b
  300.                 db 00000000b
  301.                 db 00000000b
  302.                 db 00000000b
  303.  
  304. nuotti          db 0
  305. kohta           db 0
  306.  
  307. txt_counter     dw 0
  308.  
  309. stat_teksti     db 'SUOMI-INTRO 6.12.1994',0dh,0ah,'$'
  310.  
  311. teksti          label byte
  312.                 db "*+ Paljon onnea itsenäisenäiselle Suomelle 6.12.1994! *+"
  313.                 db 80 dup(?)
  314.  
  315. wanha_timer     dw ?,?
  316.  
  317. code    ends
  318.         end main